#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include "utils.h"

int OpenFile(char* filePath) {
	int fileDescriptor;
	fileDescriptor = open(filePath, O_RDWR);
	if (fileDescriptor == -1) {
		perror("Blad podczas wywolania funkcji: open");

	}

	return fileDescriptor;
}

int GetFileSize(int fileDescriptor) {
	struct stat iNode;
	if (fstat(fileDescriptor, &iNode)) {
		perror("Blad podczas wywolania funkcji: fstat");
		return -1;
	}
#ifdef DEBUG
	printf("Rozmiar pliku: %d\n", (int) iNode.st_size);
#endif

	return (int) iNode.st_size;
}

void* GetMappedFileAddress(int fileDescriptor, int fileSize) {
	void* mappedFile;
	mappedFile = mmap(NULL, fileSize, PROT_READ | PROT_WRITE, MAP_SHARED,
			fileDescriptor, 0);

	if (mappedFile == (void *) -1) {
		perror("Blad podczas wywolania funkcji: mmap");
	}

	return mappedFile;
}

void SyncFile(MAPPED_FILE mappedFile) {
	msync(mappedFile.mapped, mappedFile.size, MS_SYNC);
	munmap(mappedFile.mapped, mappedFile.size);
}

MAPPED_FILE MapFile(char* filePath) {
	MAPPED_FILE fileData;
	fileData.error = 0;
	void* mappedFile;
	int fileDescriptor;
	int fileSize;
	fileDescriptor = OpenFile(filePath);

	if (fileDescriptor == -1) {
		fileData.error = 1;
		return fileData;
	}

	fileSize = GetFileSize(fileDescriptor);

	if (fileSize == -1) {
		fileData.error = 1;
		return fileData;
	}

	fileData.size = fileSize;

	mappedFile = GetMappedFileAddress(fileDescriptor, fileSize);
	if (mappedFile == (void *) -1) {
		fileData.error = 1;
		return fileData;
	}

	fileData.mapped = mappedFile;

	close(fileDescriptor);

	return fileData;
}

void Replace(char* text, char source, char target) {
	char *it;
	int count;

	for (it = text, count = 0; *it != '\0'; it++) {
		if (*it == source) {
			*it = target;
			count++;
		}
	}

	printf("%d znakow '%c' zastapionych przez znak '%c' \n", count, source, target);

}


